home *** CD-ROM | disk | FTP | other *** search
/ The Utilities Experience / The Utilities Experience - Volume 1.iso / software / programmers / source / chnky2plnr / c2p_040_fastram4.s < prev    next >
Text File  |  1978-06-29  |  5KB  |  254 lines

  1. ; Chunky2Planar algorithm.
  2. ;
  3. ;     Cpu only solution VERSION 2
  4. ;    Optimised for 040+fastram
  5. ;    analyse instruction offsets to check performance
  6.  
  7.     output    five_pass.o
  8.     opt    l+    ;Linkable code
  9.     opt    c+    ;Case sensitive
  10.     opt    d-    ;No debugging information
  11.     opt    m+    ;Expand macros in listing
  12.     opt    o-    ;No optimisation
  13.  
  14. ;quad_begin:
  15. ;    cnop    0,16
  16.  
  17.     xdef    _chunky2planar
  18.  
  19. ;  a0 -> chunky pixels
  20. ;  a1 -> plane0
  21.  
  22. width        equ    320        ; must be multiple of 32
  23. height        equ    200
  24. plsiz        equ    (width/8)*height
  25.  
  26.  
  27. merge    MACRO in1,in2,tmp3,tmp4,mask,shift
  28.     ;        \1 = abqr
  29.     ;        \2 = ijyz
  30.     move.l    \2,\4
  31.     move.l    #\5,\3
  32.     and.l    \3,\2    \2 = 0j0z
  33.     and.l    \1,\3    \3 = 0b0r
  34.     eor.l    \3,\1    \1 = a0q0
  35.     eor.l    \2,\4    \4 = i0y0
  36.     IFEQ    \6-1
  37.     add.l    \3,\3
  38.     ELSE
  39.     lsl.l    #\6,\3    \3 = b0r0
  40.     ENDC
  41.     lsr.l    #\6,\4    \4 = 0i0y
  42.     or.l    \3,\2    \2 = bjrz
  43.     or.l    \4,\1    \1 = aiqy
  44.     ENDM
  45.  
  46.  
  47. _chunky2planar:
  48.     jmp    next
  49. next
  50.     ; round down address of c2p
  51.     lea    c2p(pc),a0
  52.     move.l    a0,d0
  53.     and.b    #%11110000,d0
  54.     move.l    d0,a1
  55.     
  56.     ; patch jmp
  57.     move.l    d0,_chunky2planar+2
  58.     move.w    #(end-c2p)-1,d0
  59. loop    move.b    (a0)+,(a1)+
  60.     dbra    d0,loop
  61.  
  62.     ;tidy cache
  63.     movem.l    d2-d7/a2-a6,-(sp)    
  64.     move.l    $4.w,a6
  65.     jsr    -636(a6)
  66.     movem.l    (sp)+,d2-d7/a2-a6
  67.     rts
  68.     
  69.     cnop    0,16
  70. c2p:
  71.         movem.l    d2-d7/a2-a6,-(sp)
  72.  
  73.         ; a0 = chunky buffer
  74.         ; a1 = output area
  75.         
  76.         lea    4*plsiz(a1),a1    ; a1 -> plane4
  77.         
  78.         move.l    a0,d0
  79.         add.l    #16,d0
  80.         and.b    #%11110000,d0
  81.         move.l    d0,a0
  82.         
  83.         move.l    a0,a2
  84.         add.l    #8*plsiz,a2
  85.  
  86.         lea    p0(pc),a3        
  87.         bra.s    mainloop
  88.  
  89.     cnop    0,16
  90. mainloop:
  91.     move.l    0(a0),d0
  92.      move.l    4(a0),d2
  93.      move.l    8(a0),d1
  94.     move.l    12(a0),d3
  95.     move.l    2(a0),d4
  96.      move.l    10(a0),d5
  97.     move.l    6(a0),d6
  98.     move.l    14(a0),d7
  99.  
  100.      move.w    16(a0),d0
  101.      move.w    24(a0),d1
  102.     move.w    20(a0),d2
  103.     move.w    28(a0),d3
  104.      move.w    18(a0),d4
  105.      move.w    26(a0),d5
  106.     move.w    22(a0),d6
  107.     move.w    30(a0),d7
  108.     
  109.     adda.w    #32,a0
  110.     move.l    d6,a5
  111.     move.l    d7,a6
  112.  
  113.     merge    d0,d1,d6,d7,$00FF00FF,8
  114.     merge    d2,d3,d6,d7,$00FF00FF,8
  115.  
  116.     merge    d0,d2,d6,d7,$0F0F0F0F,4    
  117.     merge    d1,d3,d6,d7,$0F0F0F0F,4
  118.  
  119.     exg.l    d0,a5
  120.     exg.l    d1,a6    
  121.     
  122.     merge    d4,d5,d6,d7,$00FF00FF,8
  123.     merge    d0,d1,d6,d7,$00FF00FF,8
  124.     
  125.     merge    d4,d0,d6,d7,$0F0F0F0F,4
  126.     merge    d5,d1,d6,d7,$0F0F0F0F,4
  127.  
  128.     merge    d2,d0,d6,d7,$33333333,2
  129.     merge    d3,d1,d6,d7,$33333333,2    
  130.  
  131.     merge    d2,d3,d6,d7,$55555555,1
  132.     merge    d0,d1,d6,d7,$55555555,1
  133.     move.l    d3,2*4(a3)    ;plane2
  134.     move.l    d2,3*4(a3)    ;plane3
  135.     move.l    d1,0*4(a3)    ;plane0
  136.     move.l    d0,1*4(a3)    ;plane1
  137.  
  138.     move.l    a5,d2
  139.     move.l    a6,d3
  140.  
  141.     merge    d2,d4,d6,d7,$33333333,2
  142.     merge    d3,d5,d6,d7,$33333333,2
  143.  
  144.     merge    d2,d3,d6,d7,$55555555,1
  145.     merge    d4,d5,d6,d7,$55555555,1
  146.     move.l    d3,6*4(a3)        ;bitplane6
  147.     move.l    d2,7*4(a3)        ;bitplane7
  148.     move.l    d5,4*4(a3)        ;bitplane4
  149.     move.l    d4,5*4(a3)        ;bitplane5
  150.  
  151.  
  152. inner:
  153.     move.l    0(a0),d0
  154.      move.l    4(a0),d2
  155.      move.l    8(a0),d1
  156.     move.l    12(a0),d3
  157.     move.l    2(a0),d4
  158.      move.l    10(a0),d5
  159.     move.l    6(a0),d6
  160.     move.l    14(a0),d7
  161.  
  162.      move.w    16(a0),d0
  163.      move.w    24(a0),d1
  164.     move.w    20(a0),d2
  165.     move.w    28(a0),d3
  166.      move.w    18(a0),d4
  167.      move.w    26(a0),d5
  168.     move.w    22(a0),d6
  169.     move.w    30(a0),d7
  170.     
  171.     adda.w    #32,a0
  172.     move.l    d6,a5
  173.     move.l    d7,a6
  174.  
  175.     ; write    bitplane 7    
  176.  
  177.     move.l    2*4(a3),-2*plsiz(a1)    ;plane2
  178.     merge    d0,d1,d6,d7,$00FF00FF,8
  179.     merge    d2,d3,d6,d7,$00FF00FF,8
  180.  
  181.     ; write    
  182.     move.l    3*4(a3),-plsiz(a1)    ;plane3
  183.     merge    d0,d2,d6,d7,$0F0F0F0F,4    
  184.     merge    d1,d3,d6,d7,$0F0F0F0F,4
  185.  
  186.     exg.l    d0,a5
  187.     exg.l    d1,a6    
  188.     
  189.     ; write
  190.     move.l    0*4(a3),-4*plsiz(a1)    ;plane0
  191.     merge    d4,d5,d6,d7,$00FF00FF,8
  192.     merge    d0,d1,d6,d7,$00FF00FF,8
  193.     
  194.     ; write    
  195.     move.l    1*4(a3),-3*plsiz(a1) ;plane1
  196.     merge    d4,d0,d6,d7,$0F0F0F0F,4
  197.     merge    d5,d1,d6,d7,$0F0F0F0F,4
  198.  
  199.     ; write    
  200.     move.l    6*4(a3),2*plsiz(a1)    ;bitplane6
  201.     merge    d2,d0,d6,d7,$33333333,2
  202.     merge    d3,d1,d6,d7,$33333333,2    
  203.  
  204.     ; write
  205.     move.l    7*4(a3),3*plsiz(a1)    ;bitplane7
  206.     merge    d2,d3,d6,d7,$55555555,1
  207.     merge    d0,d1,d6,d7,$55555555,1
  208.     move.l    d3,2*4(a3)    ;plane2
  209.     move.l    d2,3*4(a3)    ;plane3
  210.     move.l    d1,0*4(a3)    ;plane0
  211.     move.l    d0,1*4(a3)    ;plane1
  212.  
  213.     move.l    a5,d2
  214.     move.l    a6,d3
  215.  
  216.     move.l    4*4(a3),(a1)+        ;bitplane4    
  217.     merge    d2,d4,d6,d7,$33333333,2
  218.     merge    d3,d5,d6,d7,$33333333,2
  219.  
  220.     move.l    5*4(a3),-4+1*plsiz(a1)    ;bitplane5
  221.     merge    d2,d3,d6,d7,$55555555,1
  222.     merge    d4,d5,d6,d7,$55555555,1
  223.     move.l    d3,6*4(a3)        ;bitplane6
  224.     move.l    d2,7*4(a3)        ;bitplane7
  225.     move.l    d5,4*4(a3)        ;bitplane4
  226.     move.l    d4,5*4(a3)        ;bitplane5
  227.  
  228.     cmpa.l    a0,a2
  229.     bne.w    inner
  230.  
  231.     move.l    2*4(a3),-2*plsiz(a1)    ;plane2
  232.     move.l    3*4(a3),-plsiz(a1)    ;plane3
  233.     move.l    0*4(a3),-4*plsiz(a1)    ;plane0
  234.     move.l    1*4(a3),-3*plsiz(a1)     ;plane1
  235.     move.l    6*4(a3),2*plsiz(a1)    ;bitplane6
  236.     move.l    7*4(a3),3*plsiz(a1)    ;bitplane7
  237.     move.l    4*4(a3),(a1)+        ;bitplane4    
  238.     move.l    5*4(a3),-4+1*plsiz(a1)    ;bitplane5
  239.  
  240. exit
  241.     movem.l    (sp)+,d2-d7/a2-a6
  242.     rts
  243.  
  244.     cnop    0,4
  245. end:
  246. p0    dc.l    0
  247. p1    dc.l    0
  248. p2    dc.l    0
  249. p3    dc.l    0
  250. p4    dc.l    0
  251. p5    dc.l    0
  252. p6    dc.l    0
  253. p7    dc.l    0
  254.